直接看個C# 例子:
string? str = null;
當加上 '?' 變數 str 可為 null,且編譯器不會為此發出警告
Example:
object? GetPotentialNull(bool flag)
{
return flag ? null : new object();
}
void Foo()
{
object obj = GetPotentialNull(false);
}
上述程式碼因為GetPotentialNull(false) 寫死代入false,
obj 永遠不會為 null,但編譯器並不能理解這點,還是會發出警告。
您可以通過以下方式抑制警告:
object obj = GetPotentialNull(false)!;
當加上 '!' 運算符,我們向編譯器“解釋”該方法絕對不會返回 null。
因此,此行程式碼片段將不會發出警告。
舉個例子:
public string Name
{
get => _name;
set => _name = value ?? "defaultName";
}
private string _name;
如果將 null 值寫入 Name,編譯器將發出警告:
警告 CS8618 退出建構函式時,不可為 Null 的 欄位 '_name' 必須包含非 Null 值。請考慮將 欄位 宣告為可為 Null。
如果 _name
的宣告類型 直接加上 '?' 符號表達可 Nullable Reference,如下:
private string? _name;
此時,編譯器將發出警告:
警告 CS8603 可能有 Null 參考傳回。 ClassLibrary1
此時
存取器 get => _name
可以返回 null(這是一個錯誤,因為string Name不可為null)
存取器 set => _name
可以接受 null(這是正確的)
這時候該怎麼做呢?
public string Name
{
get => _name;
set => _name = value ?? "defaultName";
}
[AllowNull]
private string _name;
_name
加入屬性AllowNull,編譯器將假定 _name
可能被分配為 null,儘管類型並未標記為'?',如果將此property的值分配給應該永遠不是 null 的變數,編譯器不會發出警告。
下一篇
在 C# 中 Nullable Reference Types 使用屬性NotNullWhen